/*******************************************************************************
 *    系统名称   : 约汗乐动力接口/后台管理系统
 *    客户             : 约汗乐动力
 *    文件名        ： JsonUtil.java
 *              (C) Copyright 博智乐创 Corporation 2015
 *               All Rights Reserved.
 *              http://www.bozlc.com
 * *****************************************************************************
 *    注意： 本内容仅限于约汗乐动力软件公司内部使用，未经许可禁止转发
 ******************************************************************************/
package com.xiake.utils;

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

// TODO: Auto-generated Javadoc
/**
 * The Class JsonUtil.
 *
 * @author tony
 * @since v1.1
 * @description json 简单操作的工具类
 * @created 2015-01-15
 */
public class JsonUtil{
    
    /** The gson. */
    private static Gson gson=null;
    
    static{
        if(gson==null){
        	
            gson=new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
        }
    }
    
    /**
     * Instantiates a new json util.
     */
    private JsonUtil(){}
    
    /**
     * 将对象转换成json格式.
     *
     * @param ts the ts
     * @return the string
     */
    public static String objectToJson(Object ts){
        String jsonStr=null;
        if(gson!=null){
            jsonStr=gson.toJson(ts);
        }
        return jsonStr;
    }
    
    /**
     * 将对象转换成json格式(并自定义日期格式).
     *
     * @param ts the ts
     * @param dateformat the dateformat
     * @return the string
     */
    public static String objectToJsonDateSerializer(Object ts,final String dateformat){
        String jsonStr=null;
        gson=new GsonBuilder().registerTypeHierarchyAdapter(Date.class, new JsonSerializer<Date>() {
            public JsonElement serialize(Date src, Type typeOfSrc,
                                         JsonSerializationContext context) {
                SimpleDateFormat format = new SimpleDateFormat(dateformat);
                return new JsonPrimitive(format.format(src));
            }
        }).setDateFormat(dateformat).create();
        if(gson!=null){
            jsonStr=gson.toJson(ts);
        }
        return jsonStr;
    }
    
    /**
     * 将json格式转换成list对象.
     *
     * @param jsonStr the json str
     * @return the list
     */
    public static List<?> jsonToList(String jsonStr){
        List<?> objList=null;
        if(gson!=null){
            Type type=new com.google.gson.reflect.TypeToken<List<?>>(){}.getType();
            objList=gson.fromJson(jsonStr, type);
        }
        return objList;
    }
    
    /**
     * 将json格式转换成map对象.
     *
     * @param jsonStr the json str
     * @return the map
     */
    public static Map<?,?> jsonToMap(String jsonStr){
        Map<?,?> objMap=null;
        if(gson!=null){
            Type type=new com.google.gson.reflect.TypeToken<Map<?,?>>(){}.getType();
            objMap=gson.fromJson(jsonStr, type);
        }
        return objMap;
    }
    
    /**
     * 将json转换成bean对象.
     *
     * @param jsonStr the json str
     * @param cl the cl
     * @return the object
     */
    public static Object  jsonToBean(String jsonStr,Class<?> cl){
        Object obj=null;
        if(gson!=null){
            obj=gson.fromJson(jsonStr, cl);
        }
        return obj;
    }
    
    /**
     * 将json转换成bean对象.
     *
     * @param <T> the generic type
     * @param jsonStr the json str
     * @param cl the cl
     * @param pattern the pattern
     * @return the t
     */
    @SuppressWarnings("unchecked")
    public static <T> T  jsonToBeanDateSerializer(String jsonStr,Class<T> cl,final String pattern){
        Object obj=null;
        gson=new GsonBuilder().registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
            public Date deserialize(JsonElement json, Type typeOfT,
                                    JsonDeserializationContext context)
                    throws JsonParseException {
                SimpleDateFormat format=new SimpleDateFormat(pattern);
                String dateStr=json.getAsString();
                try {
                    return format.parse(dateStr);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }).setDateFormat(pattern).create();
        if(gson!=null){
            obj=gson.fromJson(jsonStr, cl);
        }
        return (T)obj;
    }
    
    /**
     * 根据.
     *
     * @param jsonStr the json str
     * @param key the key
     * @return the json value
     */
    public static String  getJsonValue(String jsonStr,String key){
        Object rulsObj=null;
        Map<?,?> rulsMap=jsonToMap(jsonStr);
        if(rulsMap!=null&&rulsMap.size()>0){
            rulsObj=rulsMap.get(key);
        }
        return (String) rulsObj;
    }

}